package com.snapan.config;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

/**
 * 自定义拦截器（例如：登录校验拦截器）
 */
public class LoginInterceptor implements HandlerInterceptor {

    /**
     * 预处理：在Controller方法执行前调用
     * 返回true：放行（继续执行后续拦截器或Controller）
     * 返回false：拦截（不再执行后续操作）
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 示例：校验用户是否登录（从Session中获取用户信息）
        Object user = request.getSession().getAttribute("loginUser");
        if (user == null) {
            // 未登录：跳转到登录页
            response.sendRedirect(request.getContextPath() + "/login");
            return false; // 拦截
        }

        // 已登录：放行
        return true;
        // 辅助方法：判断是否为公开接口（无需登录）

    }

    /**
     * 后处理：在Controller方法执行后、视图渲染前调用
     * 可用于修改ModelAndView数据
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // 例如：添加全局共享数据
        if (modelAndView != null) {
            modelAndView.addObject("globalKey", "全局值");
        }
    }

    /**
     * 完成处理：在视图渲染完成后调用（整个请求结束）
     * 可用于释放资源、记录日志等
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 例如：记录请求耗时
        long startTime = (long) request.getAttribute("startTime");
        long endTime = System.currentTimeMillis();
        System.out.println("请求耗时：" + (endTime - startTime) + "ms");
    }
}